package org.ebookdroid.ui.library; import org.emdev.ui.actions.ActionEx; import org.emdev.ui.actions.params.Constant; import org.emdev.ui.uimanager.UIManagerAppCompat; import org.sufficientlysecure.viewer.R; import org.ebookdroid.common.settings.LibSettings; import org.ebookdroid.common.settings.books.BookSettings; import org.ebookdroid.common.settings.books.Bookmark; import org.ebookdroid.core.PageIndex; import org.ebookdroid.ui.library.adapters.BookNode; import org.ebookdroid.ui.library.adapters.BookShelfAdapter; import org.ebookdroid.ui.library.adapters.BooksAdapter; import org.ebookdroid.ui.library.adapters.LibraryAdapter; import org.ebookdroid.ui.library.adapters.RecentAdapter; import org.ebookdroid.ui.library.views.BookcaseView; import org.ebookdroid.ui.library.views.LibraryView; import org.ebookdroid.ui.library.views.RecentBooksView; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.design.widget.TabLayout; import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; import android.text.SpannableStringBuilder; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.widget.AbsListView; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.ExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ExpandableListView.ExpandableListContextMenuInfo; import android.widget.ImageView; import android.widget.ViewFlipper; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.emdev.BaseDroidApp; import org.emdev.common.android.AndroidVersion; import org.emdev.common.filesystem.MediaManager; import org.emdev.ui.AbstractActionActivity; import org.emdev.ui.actions.ActionMenuHelper; import org.emdev.ui.uimanager.IUIManager; import org.emdev.utils.FileUtils; import org.emdev.utils.LengthUtils; public class RecentActivity extends AbstractActionActivity<RecentActivity, RecentActivityController> { public static final int VIEW_RECENT = 0; public static final int VIEW_LIBRARY = 1; private ViewFlipper viewflipper; BookcaseView bookcaseView; RecentBooksView recentBooksView; LibraryView libraryView; public RecentActivity() { super(true, ON_CREATE, ON_RESUME); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#createController() */ @Override protected RecentActivityController createController() { return new RecentActivityController(this); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#onCreateImpl(android.os.Bundle) */ @Override protected void onCreateImpl(final Bundle savedInstanceState) { setContentView(R.layout.recent); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#onResumeImpl() */ @Override protected void onResumeImpl() { UIManagerAppCompat.invalidateOptionsMenu(this); // HACK: invalidating the adapter when the tab view is not visible seems to leave // the scroll position in the wrong place. Handler h = new Handler(Looper.getMainLooper()); h.post(new Runnable() { @Override public void run() { final TabLayout tl = (TabLayout) findViewById(R.id.tabs); if (tl != null) { tl.setScrollPosition(tl.getSelectedTabPosition(), 0.0f, true); } } }); } /** * {@inheritDoc} * * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu) */ @Override public boolean onCreateOptionsMenu(final Menu menu) { final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.recentmenu, menu); MenuItem searchItem = menu.findItem(R.id.recentmenu_searchBook); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { ActionEx a = getController().getOrCreateAction(R.id.actions_searchBook); a.addParameter(new Constant("input", new SpannableStringBuilder(query))); a.run(); return true; } @Override public boolean onQueryTextChange(String newText) { return false; } }); return true; } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#updateMenuItems(android.view.Menu) */ @Override protected void updateMenuItems(final Menu menu) { final LibSettings ls = LibSettings.current(); if (!ls.useBookcase) { final int viewMode = getViewMode(); final boolean showLibraryAvailable = viewMode == RecentActivity.VIEW_RECENT; ActionMenuHelper.setMenuItemVisible(menu, showLibraryAvailable, R.id.recent_showlibrary); ActionMenuHelper.setMenuItemVisible(menu, !showLibraryAvailable, R.id.recent_showrecent); } else { ActionMenuHelper.setMenuItemVisible(menu, false, R.id.recent_showlibrary); ActionMenuHelper.setMenuItemVisible(menu, false, R.id.recent_showrecent); } ActionMenuHelper.setMenuItemExtra(menu, R.id.recent_storage_all, "path", "/"); ActionMenuHelper.setMenuItemExtra(menu, R.id.recent_storage_external, "path", BaseDroidApp.EXT_STORAGE.getAbsolutePath()); final MenuItem storageMenu = menu.findItem(R.id.recent_storage_menu); if (storageMenu != null) { final SubMenu subMenu = storageMenu.getSubMenu(); subMenu.removeGroup(R.id.actions_storageGroup); final Set<String> added = new HashSet<String>(); added.add("/"); added.add(FileUtils.getCanonicalPath(BaseDroidApp.EXT_STORAGE)); if (ls.showScanningInMenu) { for (final String path : ls.autoScanDirs) { final File file = new File(path); final String mp = FileUtils.getCanonicalPath(file); if (mp != null && added.add(mp)) { addStorageMenuItem(subMenu, R.drawable.recent_menu_storage_scanned, file.getPath(), path); } } } if (ls.showRemovableMediaInMenu) { for (final String path : MediaManager.getReadableMedia()) { final File file = new File(path); final String mp = FileUtils.getCanonicalPath(file); if (mp != null && added.add(mp)) { addStorageMenuItem(subMenu, R.drawable.recent_menu_storage_external, file.getName(), path); } } } } } protected void addStorageMenuItem(final Menu menu, final int resId, final String name, final String path) { final MenuItem bmi = menu.add(R.id.actions_storageGroup, R.id.actions_storage, Menu.NONE, name); bmi.setIcon(resId); ActionMenuHelper.setMenuItemExtra(bmi, "path", path); } /** * {@inheritDoc} * * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo) */ @Override public void onCreateContextMenu(final ContextMenu menu, final View v, final ContextMenuInfo menuInfo) { final Object source = getContextMenuSource(v, menuInfo); if (source instanceof BookNode) { onCreateBookMenu(menu, (BookNode) source); } else if (source instanceof BookShelfAdapter) { onCreateShelfMenu(menu, (BookShelfAdapter) source); } ActionMenuHelper.setMenuSource(getController(), menu, source); } protected Object getContextMenuSource(final View v, final ContextMenuInfo menuInfo) { Object source = null; if (menuInfo instanceof AdapterContextMenuInfo) { final AbsListView list = (AbsListView) v; final AdapterContextMenuInfo mi = (AdapterContextMenuInfo) menuInfo; source = list.getAdapter().getItem(mi.position); } else if (menuInfo instanceof ExpandableListContextMenuInfo) { final ExpandableListView list = (ExpandableListView) v; final ExpandableListAdapter adapter = list.getExpandableListAdapter(); final ExpandableListContextMenuInfo mi = (ExpandableListContextMenuInfo) menuInfo; final long pp = mi.packedPosition; final int group = ExpandableListView.getPackedPositionGroup(pp); final int child = ExpandableListView.getPackedPositionChild(pp); if (child >= 0) { source = adapter.getChild(group, child); } else { source = adapter.getGroup(group); } } return source; } protected void onCreateBookMenu(final ContextMenu menu, final BookNode node) { final BookSettings bs = node.settings; final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.book_menu, menu); menu.setHeaderTitle(node.path); menu.findItem(R.id.bookmenu_recentgroup).setVisible(bs != null); final BookShelfAdapter bookShelf = getController().getBookShelf(node); final BookShelfAdapter current = bookcaseView != null ? getController().getBookShelf( bookcaseView.getCurrentList()) : null; menu.findItem(R.id.bookmenu_openbookshelf).setVisible( bookShelf != null && current != null && bookShelf != current); final MenuItem om = menu.findItem(R.id.bookmenu_open); final SubMenu osm = om != null ? om.getSubMenu() : null; if (osm == null) { return; } osm.clear(); final List<Bookmark> list = new ArrayList<Bookmark>(); list.add(new Bookmark(true, getString(R.string.bookmark_start), PageIndex.FIRST, 0, 0)); list.add(new Bookmark(true, getString(R.string.bookmark_end), PageIndex.LAST, 0, 1)); if (bs != null) { if (LengthUtils.isNotEmpty(bs.bookmarks)) { list.addAll(bs.bookmarks); } list.add(new Bookmark(true, getString(R.string.bookmark_current), bs.currentPage, bs.offsetX, bs.offsetY)); } Collections.sort(list); for (final Bookmark b : list) { addBookmarkMenuItem(osm, b); } } protected void addBookmarkMenuItem(final Menu menu, final Bookmark b) { final MenuItem bmi = menu.add(R.id.actions_goToBookmarkGroup, R.id.actions_goToBookmark, Menu.NONE, b.name); bmi.setIcon(R.drawable.viewer_menu_bookmark); ActionMenuHelper.setMenuItemExtra(bmi, "bookmark", b); } protected void onCreateShelfMenu(final ContextMenu menu, final BookShelfAdapter a) { final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.library_menu, menu); menu.setHeaderTitle(a.name); } void changeLibraryView(final int view) { final ViewFlipper vf = getViewflipper(); if (view == VIEW_LIBRARY) { vf.setDisplayedChild(VIEW_LIBRARY); } else { vf.setDisplayedChild(VIEW_RECENT); } } int getViewMode() { final ViewFlipper vf = getViewflipper(); return vf != null ? vf.getDisplayedChild() : VIEW_RECENT; } void showBookshelf(final int shelfIndex) { if (bookcaseView != null) { bookcaseView.setCurrentList(shelfIndex); } } void showNextBookshelf() { if (bookcaseView != null) { bookcaseView.nextList(); } } void showPrevBookshelf() { if (bookcaseView != null) { bookcaseView.prevList(); } } void showBookcase(final BooksAdapter bookshelfAdapter, final RecentAdapter recentAdapter) { final ViewFlipper vf = getViewflipper(); vf.removeAllViews(); if (bookcaseView == null) { bookcaseView = (BookcaseView) LayoutInflater.from(this).inflate(R.layout.bookcase_view, vf, false); bookcaseView.init(bookshelfAdapter, recentAdapter); } vf.addView(bookcaseView, 0); } void showLibrary(final LibraryAdapter libraryAdapter, final RecentAdapter recentAdapter) { if (recentBooksView == null) { recentBooksView = new RecentBooksView(getController(), recentAdapter); registerForContextMenu(recentBooksView); } if (libraryView == null) { libraryView = new LibraryView(getController(), libraryAdapter); registerForContextMenu(libraryView); } final ViewFlipper vf = getViewflipper(); vf.removeAllViews(); vf.addView(recentBooksView, VIEW_RECENT); vf.addView(libraryView, VIEW_LIBRARY); if (recentAdapter.getCount() == 0) { changeLibraryView(VIEW_LIBRARY); } } ViewFlipper getViewflipper() { if (viewflipper == null) { viewflipper = (ViewFlipper) findViewById(R.id.recentflip); } return viewflipper; } }